package com.deng.test.util;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @auther deng
 * @date 2024/5/27 下午5:21
 * @desc: Jwt工具类
 */
@Component
public class JwtUtil {
    // Create a test KeyPair suitable for the desired RSA key algorithm:
    KeyPair pair = Jwts.SIG.RS512.keyPair().build();
    String secretKey = "zT6yR9aB3sO5sK7vS2aZ5qD6vA7gP8sL7wF0mZ0cV5wC7aX8vK4qE4tQ3nH8pN3wI4gK3lP9sC4bB6sG4tB0pB7lR8aN0xO0dS8oR4wX4tJ6kM0dX8qT5tI2fO6wJ5uY2vG6uH8tL4tW2hH8gO3cL1jN0pD1mN9cG1eE7zY3tA9gL3qM9jG3nP2yO2eI9zE0rS9zN4aF7uU6wJ7zI4qD2aJ1cG1yW1yZ1lR8sZ1oJ9jK9mB6kJ1pU1wO0jI2iJ5u";
    long ttlMillis = 1800000L;

    public String generateJwt(String name) {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name", name);
        return createJwt(secretKey, ttlMillis, hashMap);
    }

    public static String createJwt(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法，也就是header那部分
//        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        //生成 HMAC 密钥，根据提供的字节数组长度选择适当的 HMAC 算法，并返回相应的 SecretKey 对象。
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));

        // 设置jwt的body
        JwtBuilder builder = Jwts.builder()
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(key)
                // 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
                .claims(claims)
                // 设置过期时间
                .expiration(exp);
        return builder.compact();
    }

    public Claims checkoutJwt(String token) {
        return parseJWT(secretKey, token);
    }

    public static Claims parseJWT(String secretKey, String token) {

        //生成 HMAC 密钥，根据提供的字节数组长度选择适当的 HMAC 算法，并返回相应的 SecretKey 对象。
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));

        // 得到DefaultJwtParser
        JwtParser jwtParser = Jwts.parser()
                // 设置签名的秘钥
                .verifyWith(key)
                .build();
        Jws<Claims> jws = jwtParser.parseSignedClaims(token);
        return jws.getPayload();
    }
}
